#----------------------------------*-sh-*--------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#------------------------------------------------------------------------------
#     Copyright (C) 2014-2017 OpenFOAM Foundation
#     Copyright (C) 2019-2020 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# File
#     wmake/scripts/AllwmakeParseArguments
#
# Description
#     Allwmake argument parser
#
# Usage
#     # Parse the arguments by sourcing this script
#     . ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments
#
# Parsed options (make)
#     -k | -keep-going | -non-stop
#     -j | -jN | -j N
#
# Parsed options (wmake)
#     -debug
#     -q | -queue
#     -module-prefix=...
#         Exports FOAM_MODULE_PREFIX value.
#         Unsets FOAM_MODULE_APPBIN, FOAM_MODULE_LIBBIN.
#         Handles (user|group|openfoam) or (u|g|o) as per foamEtcFile,
#         or absolute/relative paths
#
# Parsed options (special)
#     -l | -log | -log=FILE
#     -prefix=...   same as -module-prefix=...
#
#------------------------------------------------------------------------------
# Check environment
[ -d "$WM_PROJECT_DIR" ] || {
    exec 1>&2
    echo "$0"
    echo "Error encountered:"
    echo "    The OpenFOAM environment not set or incorrect."
    echo "    Check your setup."
    echo
    exit 1
}

usage() {
    exec 1>&2
    while [ "$#" -ge 1 ]; do echo "$1"; shift; done

    # Print normal usage options
    cat<<USAGE
Executing ${0##*/} is equivalent to

   wmake -all [OPTIONS]

With additional options:
    -l | -log       Tee output to log.\$WM_OPTIONS
    -log=NAME       Tee output to given filename
    -prefix=...     Define FOAM_MODULE_PREFIX (same as wmake -module-prefix)
    -no-recursion   Prevent recursive call (do NOT call 'wmake -all')
    -fromWmake      Same as -no-recursion

See
    wmake -help (or wmake -help-full)

USAGE
    exit 0  # clean exit
}


#------------------------------------------------------------------------------
# Parse the arguments and options
#------------------------------------------------------------------------------

unset optDebug optLog optNonRecursive optPrefix optQueue

for arg in "$@"
do
    # Remove arg
    shift

    case "$arg" in
    -h | -help*)
        usage
        ;;

    -no-recurs* | -fromWmake)
        # Avoid recursion (eg, if called from wmake)
        optNonRecursive=true
        # Pass onwards to other Allwmake scripts
        ;;

    -module-prefix=* | -prefix=* | --prefix=*)
        optPrefix="${arg#*=}"
        case "$optPrefix" in
        # Prefix: user
        (u | user)
            export FOAM_MODULE_PREFIX="${FOAM_USER_LIBBIN%/*}"
            ;;

        # Prefix: group
        (g | group)
            export FOAM_MODULE_PREFIX="${FOAM_SITE_LIBBIN%/*}"
            ;;

        # Prefix: openfoam (other)
        (o | openfoam)
            export FOAM_MODULE_PREFIX="${FOAM_LIBBIN%/*}"
            ;;

        # Prefix: custom (absolute or relative)
        (*)
            export FOAM_MODULE_PREFIX="$optPrefix"
            : "${FOAM_MODULE_PREFIX:=/usr/local}"  # Default (autoconf)

            # Require absolute path
            [ "${FOAM_MODULE_PREFIX#/}" != "${FOAM_MODULE_PREFIX}" ] || \
                FOAM_MODULE_PREFIX="${PWD}/${FOAM_MODULE_PREFIX}"
            ;;
        esac

        unset FOAM_MODULE_APPBIN FOAM_MODULE_LIBBIN
        echo "Module prefix = $FOAM_MODULE_PREFIX" 1>&2
        continue    # Handled argument
        ;;

    -k | -keep-going | -non-stop)
        # Keep going, ignoring errors
        export WM_CONTINUE_ON_ERROR=true
        continue    # Permanently remove arg
        ;;

    -l | -log)
        optLog="log.${WM_OPTIONS:-build}"
        continue    # Permanently remove arg
        ;;

    -log=*)
        optLog="${arg##*=}"
        if [ -d "$optLog" ]
        then
            optLog="${optLog%/}/log.${WM_OPTIONS:-build}"
        elif [ -z "$optLog" ]
        then
            optLog="log.${WM_OPTIONS:-build}"
        fi
        continue    # Permanently remove arg
        ;;

    -debug)
        optDebug="-debug"
        continue    # Permanently remove arg
        ;;

    -q | -queue)
        optQueue="-queue"
        continue    # Permanently remove arg
        ;;

    lib | libo | libso | dep | objects)
        # Target type
        targetType="$arg"
        ;;
    esac

    # Re-insert arg
    set -- "$@" "$arg"
done


#------------------------------------------------------------------------------
# Execute wmake -all if not called from wmake
#------------------------------------------------------------------------------

if [ -z "$optNonRecursive" ]
then
    if [ -z "$optLog" ]
    then
        exec wmake -all $optDebug $optQueue $*
        exit $? # Unneeded, but just in case something went wrong
    else
        echo "Logging wmake -all output to '$optLog'" 1>&2
        echo 1>&2
        exec wmake -all $optDebug $optQueue $* 2>&1 | /usr/bin/tee $optLog
        # Need to cleanup after the tee
        rc=$? # Error code from tee (not wmake), but not entirely important
        echo "Done logging to '$optLog'" 1>&2
        exit "$rc"
    fi
fi


#------------------------------------------------------------------------------
# Activate the shell option "stop on error" unless WM_CONTINUE_ON_ERROR is set
#------------------------------------------------------------------------------

if [ -z "${WM_CONTINUE_ON_ERROR}" ]
then
    set -e
fi


#------------------------------------------------------------------------------
# Cleanup local variables and functions
#------------------------------------------------------------------------------

unset optNonRecursive optDebug optLog optPrefix optQueue
unset -f usage


#------------------------------------------------------------------------------
